📌

[GIT]Branch를 만들고, 정보를 확인하고, 병합하기 ❤

01. git branch - 현재 사용중인 브랜치 확인하기

💡
git branch

나의 경우에는 origin/main으로 달린 브랜치를 사용중이기 때문에 main이 표시되는 것을 볼 수 있다

둔치의 개발 이야기
얼마전에 사이드프로젝트를 새로 시작하려고 새로운 repository를 생성했는데 뚜둔,,, Default Branch가 main이다. 그래서 내가 뭔가 잘못 설정했나..? 싶었다. * 원래는 master가 기본이었다. Git은 10월부터 새로 만들어지는 repository는 Default Branch를 master에서 main으로 변경하기로 하였다! 이전까지 생성된 repository는 master가 그대로 유지된다 바뀐 사유를 읽어보니,,master라는 명칭에 대한 논란이 있었던거 같다.
https://dunchi.tistory.com/92

02. git branch 브랜치명 - 브랜치명으로 브랜치 생성하기

💡
git branch exp_git_test

위의 명령어를 통해서 레포지토리에는 "exp_git_test"라는 이름의 브랜치가 만들어지고, git branch 명령어를 통해서 생성된 브랜치를 확인해볼 수 있다

03. git checkout 브랜치명

💡
git checkout exp_git_test

위와 같이 명령어를 실행해보면, 기존의 main 브랜치에서 exp_git_test로 이동된 것을 확인해볼 수 있다

🌟 로그를 찍어보면 기존의 브랜치에서 만들었던 로그와 동일한 것을 보아, 기존의 브랜치와 생성된 브랜치는 같은 상태임을 알 수 있다!

그리고 새로 만든 브랜치에서 f1.txt라는 파일을 새로 만들어 수정 후 , 커밋까지 진행하고,

main 브랜치에 돌아오면 아래처럼 버전 값 확인이 안되는 것을 볼 수 있다

추가로, 원래 main 브랜치에는 f1.txt가 없었기 때문에 cat f1.txt를 하면,

💡
$ cat f1.txt cat: f1.txt: No such file or directory

아래와 같이 그런 파일이나 주소는 없다고 뜬다

즉, 파일이 어떤 브랜치에 있는지 혹은 같은 파일이더라도 어떤 브랜치에서 작업했는지에 따라서 완전히 달라질 수 있는 것이다!

즉, 아래처럼, f2.txt파일을 하나 더 만들고 버전을 생성하기까지 한 채로 main으로 이동하면 디렉토리에서 f1.txt나 f2.txt를 확인할 수가 없는 것이다!

🌟 이렇게 깃은 저장소를 추가적으로 사용하지 않고 버전관리를 할 수 있게 된다! 브랜치를 통해서!

🌟 다만, 브랜치를 위해서 익혀야 할 것이 많다!

04. Branch 정보 확인하기

04-1. 브랜치 간 정보 차이 확인하기 1 git log --branches --decorate

저장소에 있는 모든 브랜치들의 버전을 폰트 색상을 달리주어 확인할 수 있도록 도와준다

🌟 HEAD는 현재 체크아웃된 브랜치를 바라본다!

위에서는 현재 exp_git_test 브랜치의 최근 버전에서의 커밋 메시지가 "git log branches"임을 보여주고 있다

04-2. 브랜치 간 정보 확인하기 2 - git log —branches —decorate —graph

위의 명령어를 실행해보면 아래처럼 왼쪽에 | 모양의 선들이 생긴 것을 확인해볼 수 있다

이것은 그 선의 흐름대로 브랜치가 작업을 해왔다는 것을 나타내는 것인데

이것으로만 정보를 확인하는 것은 그 이전과 별다른 차이가 없다

다만, 브랜치가 서로 각자의 길을 걷고 있을 때에는 그 차이가 보여질 수 있다!

main에서도 새로운 커밋을 만들어보자

✴️ git log 는 현재 체크아웃된 브랜치의 로그만을 보여준다!

먼저 main 브랜치에서 f3.txt라는 파일을 만들고, 커밋한 후 git log --branhes --decorate --graph를 해보자

그러면 빨간 글자가 exp_git_test 브랜치의 색이고, 초록색 글자가 main 브랜치의 색인데 이 두 색상을 이용한 선들이 보이는 것을 확인해볼 수 있다

그리고 이를 통해서 두 브랜치의 공통의 조상은 바로 아래의 버전임을 확인해볼 수 있다!

💡
* commit b9c299118dfc70736142b4af4abdfe03653a0802 | Author: JSJeong <hy6219@naver.com> | Date: Fri Aug 20 20:39:47 2021 +0900

04-3. 브랜치 간 정보 확인하기 3 - git log --branches --decorate --graph --oneline

이 명령어는 —oneline옵션을 주어서 한줄에 커밋메시지와 버전 아이디값을 보여준다!

그리고 어떤 부분에서 분기되고 내용이 달라지는지도 / 표시를 통해 확인해볼 수 있다!

이를 통해서 훨씬 간결하게 살펴볼 수 있다!

🌟 깃에서 저장소 위치에서 stree를 입력하면 해당 레포지토리에 대해서 GUI로 깃을 살펴볼 수 있는 소스트리가 실행될 수 있다! 이렇게 브랜치간 작업을 GUI에서 보다 시각적으로 확인해볼 수 있지만 CLI에서도 각자만의 가치가 있다고 한다!

04-4. 브랜치 간 정보 차이 확인하기 git log 브랜치1..브랜치2

💡
$ git log main..exp_git_test

를 입력해보면

💡
commit 11cbd671f973ed34a3436e9a399d9a927d30e77d (origin/exp_git_test, exp_git_test) Author: JSJeong <hy6219@naver.com> Date: Sat Aug 21 15:04:15 2021 +0900 test:git log --branches --decorate commit 61de8713faa0c1ca9f525e0520d0593e0f310dbe Author: JSJeong <hy6219@naver.com> Date: Sat Aug 21 15:00:25 2021 +0900 git log branches

위와 같이 출력되는 것을 확인해볼 수 있는데, 이는 풀어서 설명하면 브랜치1에는 없고 브랜치2에만 있는 정보를 확인 한다는 것이다!

그러면 반대로 git log exp_git_test..main 은 아래처럼 main에서만 있는 정보를 확인하는 것이다! 즉 브랜치1이 집합A, 브랜치2가 집합B라면 B-A의 차집합 개념이라고 보면 되는 것이다!

💡
commit fdaa2113512b506daef74114cd757ac63cf02498 (HEAD -> main, origin/main, origin/HEAD) Merge: b1fe5a6 a17ee32 Author: JSJeong <hy6219@naver.com> Date: Sat Aug 21 15:41:06 2021 +0900 git push origin main Merge branch 'main' of https://github.com/hy6219/TIL commit b1fe5a664f7d2f98310bfd11492a2a43099c2ca2 Author: JSJeong <hy6219@naver.com> Date: Sat Aug 21 15:25:01 2021 +0900 test:git log --branches --decorate --graph (--oneline) commit 853837bf484f440305531244821f24869c53674b Author: JSJeong <hy6219@naver.com> Date: Sat Aug 21 15:13:56 2021 +0900 test:git log --branches --decorate --graph commit a17ee32247cda9bb096ff636424bc007a02aec3f Merge: 9a47781 ffd7f37

04-5. 브랜치 간 정보 차이 +소스 차이 확인하기 git log -p 브랜치1..브랜치2

로그에 대해서 -p 옵션은 이미 아래의 링크에서 확인해본 바 있다! 소스 차이!!

[GIT]버전만들기
git cat-file -p HEAD tree cfda3bf379e4f8dba8717dee55aab78aef7f4daf author Scott Chacon 1301511835 -0700 committer Scott Chacon 1301511835 -0700 initial commit $ git ls-tree -r HEAD 100644 blob a906cb2a4a904a152... README 100644 blob 8f94139338f9404f2... Rakefile 040000 tree 99f1a6d12cb4b6f19... lib
https://hy6219.github.io/TIL/gitStudy/doItStudy/versionControl/[GIT]VCS%EC%9D%98%20%EA%B8%B0%EB%B3%B8%EC%97%90%20%EB%8C%80%ED%95%B4%EC%84%9C%20%ED%95%99%EC%8A%B5%ED%95%98%EA%B8%B0.html#94919a2d-651b-4d09-a4dd-cbb3570ac27d

먼저 exp_git_test 브랜치에서 f1.txt의 내용을 수정해주고 커밋까지 진행해준 후,

git log -p main..exp_git_test 를 실행해주었다

그 결과 —-, +++로 차이점이 드러나는데,-가 앞 +가 뒤[버전간 차이에서는 -가 이전버전, +가 지금버전]이므로 main에서는 f1.txt파일이 없었는데 지금 브랜치에서는 해당 파일이 존재하며

그 내용이 "e"가 추가되었음을 확인해볼 수 있다

04-6. 브랜치 간 정보+소스 차이 확인하기with diff!- git diff 브랜치1..브랜치2

각 브랜치의 현재 상태들을 비교 가능

💡
$ git diff main..exp_git_test

위를 실행해보면 아래처럼 마치 git log -p 브랜치1..브랜치2와 유사한 것을 확인해볼 수있다!

앞부분이 main, 뒤가 exp_git_test이기 때문에 -가 main이 되는 것이다! 따라서

main에서는 f1.txt파일이 없었는데 지금 브랜치에서는 해당 파일이 존재하며

그 내용이 "e"가 추가되었음을 확인해볼 수 있다

05. Branch 병합

각자 브랜치 작업을 진행하여 히스토리에 기록되던 중, 병합하고자 할 때 생각해볼 부분!

05-1. 분기한 브랜치 exp_git_test를 메인 브랜치인 main에 병합시키기

  1. main 브랜치로 체크아웃
  1. main 브랜치에서 merge 명령어 사용

먼저 exp_git_test에서 f1.txt 파일의 내용을 수정해주고 커밋까지 해주도록 하자

그 후 git checkout main을 통해서 메인 브랜치로 이동해주자

그 후, 아래와 같이 git merge 분기된_브랜치 명령어를 사용해주자

💡
$ git merge exp_git_test

그런데 나의 경우에는 f3.txt파일에 대해서 충돌이 있었는데,

💡
Removing gitStudy/doItStudy/readme.md CONFLICT (add/add): Merge conflict in f3.txt Auto-merging f3.txt Automatic merge failed; fix conflicts and then commit the result.

차분하게 안내되는 대로 git add 후 commit까지 적어주면 merge되는 것을 확인해볼 수 있다. 그 후 git log --branches --decorate --graph를 통해서 병합된 것을 다시금 시각적으로 확인해볼 수 있다!

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git merge exp_git_test
Removing gitStudy/doItStudy/readme.md
CONFLICT (add/add): Merge conflict in f3.txt
Auto-merging f3.txt
Automatic merge failed; fix conflicts and then commit the result.
(중략)
gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main|MERGING)
$ git merge exp_git_test
error: Merging is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main|MERGING)
$ git add .

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main|MERGING)
$ git commit -m 'test:git merge'
[main 93b78b2] test:git merge

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git log --branches --graph --decorate --oneline
*   93b78b2 (HEAD -> main) test:git merge
|\
| * 3423172 (exp_git_test) merge test pre
| * 812f1d0 git test
| * 11cbd67 (origin/exp_git_test) test:git log --branches --decorate
| * 61de871 git log branches
* | f3d0ded (origin/main, origin/HEAD) test:git diff branch1 branch2
* | e5e4274 test:git log -p 브랜치1..브랜치2
* |   fdaa211 git push origin main Merge branch 'main' of https://github.com/hy6219/TIL
|\ \
| * | a17ee32 Merge pull request #3 from hy6219/exp_git_test
| |\|
| | * ffd7f37 git branch
| | * 2aa6220 create f2.txt
| | * 4c1e3b5 test git after modify'
| | * 57d1ee6 test3
* | | b1fe5a6 test:git log --branches --decorate --graph (--oneline)
* | | 853837b test:git log --branches --decorate --graph
|/ /
* | 9a47781 git branch
* | 24d942b git branch
|/
:...skipping...
*   93b78b2 (HEAD -> main) test:git merge
|\
| * 3423172 (exp_git_test) merge test pre
| * 812f1d0 git test
| * 11cbd67 (origin/exp_git_test) test:git log --branches --decorate
| * 61de871 git log branches
* | f3d0ded (origin/main, origin/HEAD) test:git diff branch1 branch2
* | e5e4274 test:git log -p 브랜치1..브랜치2
* |   fdaa211 git push origin main Merge branch 'main' of https://github.com/hy6219/TIL
|\ \
| * | a17ee32 Merge pull request #3 from hy6219/exp_git_test
| |\|
| | * ffd7f37 git branch
| | * 2aa6220 create f2.txt
| | * 4c1e3b5 test git after modify'
| | * 57d1ee6 test3
* | | b1fe5a6 test:git log --branches --decorate --graph (--oneline)
* | | 853837b test:git log --branches --decorate --graph
|/ /
* | 9a47781 git branch
* | 24d942b git branch
|/
* b9c2991 docs:Update README.md
* c8959a7 docs:깃의 버전관리 공부
* ae3e338 add all and commit message not in vim editor
* ee951e7 git commit all option
* 4a1dfbc test git 210820-2
* 1b44d33 test git
* b5bf9f0 test git
* 8acf082 docs:git status
* 03d411d docs:References for git, JPA listener
* 46171a0 docs:Update README.md:210820-1
* 574f73c docs:JPA 엔티티 공부
* ad3123a Update README.md-210819-2
* 83005e8 docs:YAML,JUnit5 특징
* 110b0f2 JUnit5-SpringBootTest,WebMvcTest, DataJpaTest, JsonTest,RestClientTest
* 49e9231 Update README.md:210819-1
* cafa3ad overview about YAML
* b80c68a 스프링부트-자동설정
* 5dc3eaf docs:SWEA1926번 두 개의 숫자열
* 09eeabf 백준 18870번-Arrays.sort, Map구조를 이용
* 1ad9ecf Update README.md:210818-1
* 29c2314 docs:퀵정렬 알고리즘 공부
* 0104145 단위 테스트 중 나타날 수 있는 Mockito 관련 에러
* ac759cc Update TIL
* 24ae1a4 Update README.md:210817-1
* f5bc3f8 [Spring dependencies]보다 유연한 그레이들 설치하기
* 42e9e3a check gradle build settings in project
* 58858b1 Update README.md:210816-1
* b54ab0c merge sort
* be33ba6 time complexity of merge sort
* 970919b merge sort algorithm
* c247d14 Update README.md:210815-4
* 22c376a 페이징 처리를 위한 쿼리메서드
* 883f034 Update README.md:210815-3
* b232238 정렬을 위한 다양한 쿼리메서드 정의 방식 with 코드가독성 측면
* 407461b Update README.md:210815-2

🌟 만약, 나와 같이 충돌이 있지 않는다면, 병합되면서 vim에디터가 뜨는데, 에디터에서 메시지를 수정하지 않는다면, 자동으로 Merge branch '분기된 브랜치명' 이 맨 상단에 보일 것이다(로그 추적시)

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (exp_git_test)
$ git checkout main
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 7 commits.
  (use "git push" to publish your local commits)

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git merge exp_git_test
Merge made by the 'recursive' strategy.
 f4.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 f4.txt
$ git log --branches --decorate --graph
*   commit 9998e7dc8f9144d4f1c763887dc5aea0ed22fcf7 (HEAD -> main)
|\  Merge: 17b2381 1ace639
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:02:03 2021 +0900
| |
| |     Merge branch 'exp_git_test'
| |
| * commit 1ace6395b646923fb6fc03f8e0255785e66b363c (exp_git_test)
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:01:47 2021 +0900
| |
| |     test:git merge test
| |
* | commit 17b2381859c49278d23f2f333905a3f5809d3667
|\| Merge: 93b78b2 7172399
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:00:28 2021 +0900
| |
| |     merging
| |
| * commit 717239987a4e404ad63a6420f7ff799cf768714e
| | Author: JSJeong <hy6219@naver.com>

그러면 원래 분기전 포인트와 merge 포인트들로 부터 여러개의 부모 지점들이 생기게 된다![이제 main에서는 f1~f4.txt를 모두 갖고, f3.txt를 예로 들면 아래처럼 내용이 병합된 것을 확인해볼 수 있다]

<<<<<<< HEAD
iii
=======
git
<<<<<<< HEAD
>>>>>>> exp_git_test
=======
merge test
>>>>>>> exp_git_test

05-2. 05-1은 분기된 브랜치를 복사해서 main에 넣는것이라면, 이제는 분기된 브랜치와 main브랜치가 완전하게 같게 만들도록 하자

지금 하려는 것이 무슨 말인지 확인해보기 위해서 분기된 브랜치인 exp_git_test 브랜치로 체크아웃해보자

그 후 f3.txt 파일을 확인해보면, 분기된 브랜치에서 작성된 내용만이 포함된 것을 확인해볼 수 있다

직감이 오는가?? 그렇다! 이전에는 a 팀원님, 합본하기 위해서 팀장님께 파일 전달부탁드려요 라는 느낌으로 a 팀원은 그 팀원이 작성한 파일만 갖고 있었다면

이번에는 a 팀원님, 작업하면서 모든 팀원들과 같은 파일들을 갖고 있도록 합시다 라는 느낌이다!

$ cat f3.txt
git
merge test

이런 느낌으로 가보자!

먼저, 분기된 브랜치인 exp_git_test 브랜치로 체크아웃해보자

git checkout exp_git_test

🌟 main을 exp_git_test로 즉, 메인브랜치 내용을 분기된 브랜치로 가져오도록 하기 위해서 분기된 브랜치에서 git merge 메인브랜치를 해주자

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (exp_git_test)
$ git merge main
$ git log --branches --decorate --graph
*   commit 9998e7dc8f9144d4f1c763887dc5aea0ed22fcf7 (HEAD -> exp_git_test, main)
|\  Merge: 17b2381 1ace639
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:02:03 2021 +0900
| |
| |     Merge branch 'exp_git_test'
| |
| * commit 1ace6395b646923fb6fc03f8e0255785e66b363c
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:01:47 2021 +0900
| |
| |     test:git merge test
| |
* | commit 17b2381859c49278d23f2f333905a3f5809d3667
|\| Merge: 93b78b2 7172399
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:00:28 2021 +0900
| |
| |     merging
| |
| * commit 717239987a4e404ad63a6420f7ff799cf768714e
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 16:59:49 2021 +0900

그러면 HEAD, 즉 지금 체크아웃된 브랜치를 가리키는 HEAD가 exp_git_test를 가리키는데, 최신의 커밋이 exp_git_test와 main을 동시에 가리키고 있는 것을 확인해볼 수 있다!

그리고 두번째 라인위에 있는 * 표시를 확인해보았을 때, 해당 버전까지 포함시켜서 두 브랜치는 완전히 같은 상태가 되었다!

05-3. git branch -d 분기된 브랜치명 : 브랜치 삭제

나는 지금 exp_git_test를 계속해서 테스트용으로 사용하기 위해서 새로 exp라는 브랜치를 새로 만들어서 테스트해보겠다!

먼저 main브랜치로 이동하자

💡
git checkout main

그리고 exp라는 브랜치를 만들고 확인하자

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch 'exp'

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch
  exp
  exp_git_test
* main

그리고 아래와 같이 명령어를 실행해보고 git branch로 확인해보자

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch -d exp
Deleted branch exp (was 9998e7d).

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch
  exp_git_test
* main

그러면 만들었던 브랜치가 삭제되었음을 확인해볼 수 있다